package com.zjj.learn.javaplus.pkg03.demo301;

public class TestDemo301_1 {

    public static void main(String[] args) {

        //  父类类型 对象名称 = new 子类构造器;
        Animal dlam = new Cat();
        // 对于方法的调用：编译看左边，运行看右边。
        dlam.run();
        // 对于变量的调用：编译看左边，运行看左边。
        System.out.println(dlam.name);


        Animal taiDi = new Dog();
        // 对于方法的调用：编译看左边，运行看右边。
        taiDi.run();
        // 对于变量的调用：编译看左边，运行看左边。
        System.out.println(taiDi.name);


    }


/**
 * 多态的入门：形式、概念、识别技巧及使用前提
 * 面向对象的三大特征：封装、继承和多态
 * 多态的形式【两种】：
 *    父类类型 对象名称 = new 子类构造器
 *    接口    对象名称 = new 实现类构造器
 *
 * 父类的类型范围 > 子类类型范围
 * 多态的概念：
 *    相同类型的对象，在执行同一个形式时，根据具体对象的状态的不同从而表现出不同的行为特征。
 *    （例如：人【Person】需要工作【work()】，程序员【Programmer】和老师【Teacher】的具体工作情况就不同了）
 *
 * 多态的识别技巧：
 *     对于方法的调用：编译看左边，运行看右边
 *     对于变量的调用：编译看左边，运行看左边
 *   例如，如下代码
 *      Animal dlam = new Cat();  // Animal 是接口，Cat 是 Animal 的具体实现类
 *      dlam.run(); //  在调用方法时，调用的是对象中的方法【方法调用运行看右边】
 *      System.out.println(dlam.name); // 在调用变量时，调用的是接口中的变量【变量调用运行看左边】
 *
 * 多态的使用前提：
 *    1、必须存在继承【extend】或者实现【implement】关系
 *    2、必须存在父类类型的变量引用子类类型的对象
 *     （或者必须存在接口类型变量引用实现类类型变量）
 *      例如：Animal dlam = new Cat(); 【Animal 为接口，dlam 为接口类型变量，Cat 为实现类类型】
 *    3、需要存在重写的方法{@link com.zjj.learn.javaplus.pkg03.demo301.Cat#run()}
 **/
}


class Dog extends Animal {
    public String name = "🐶名称Dog";

    @Override
    public void run() {
        System.out.println("🐕跑的贼快~~~~！");
    }
}

class Cat extends Animal {
    public String name = "🐱名称Cat";

    @Override
    public void run() {
        System.out.println("🐱跑的飞快~~~~！");
    }

    public void lookHome(){
        System.out.println("小狗可以看家");
    }
}

class Animal {
    public String name = "动物名称Animal";

    public void run() {
        System.out.println("动物跑！");
    }
}